# -*- coding: utf-8 -*-
"""
Created on Fri Dec 13 10:50:52 2019

@author: kiranchen UIBE
"""
from sklearn.linear_model import LinearRegression
import numpy as np
from scipy import stats
import pandas as pd
import datetime as dt
from WindPy import *#使用Wind的Python接口获取股票交易数据

w.start(); # 默认命令超时时间为120秒，如需设置超时时间可以加入waitTime参数，例如waitTime=60,即设置命令超时时间为60秒  
w.isconnected() # 判断WindPy是否已经登录成功

def stock_price(stkcd,date5):#获取选定日期前180交易日的交易股价
    p=w.wsd(stkcd, "close", "ED-180TD", date5, "Currency=CNY;PriceAdj=F")
    price_stock=p.Data[0]
    date_stock=p.Times
    df=pd.DataFrame(price_stock,index=date_stock,columns=['stock'])
    rets = df['stock'].pct_change()*100
    stock=rets.to_frame()
    return stock
    
def index_price(index_code):#指数行情，选取大时间范围，匹配股票区间即可
    p=w.wsd(index_code, "close", "2013-01-01", "2019-11-30","Currency=CNY;PriceAdj=F")
    price_stock=p.Data[0]
    date_stock=p.Times
    df=pd.DataFrame(price_stock,index=date_stock,columns=['index'])
    rets = df['index'].pct_change() * 100
    index=rets.to_frame()
    return index

def df_data(index,stock,start,date5):#根据窗口期间匹配市场数据和股价数据，并删除缺失值NA
    df=pd.concat([index[start:date5],stock[start:date5]],axis=1).dropna()
    return df
    
def reg(df,start,end,date0,date5):
    x=df['index'][start:end].reshape(-1,1)
    y=df['stock'][start:end].reshape(-1,1)
    model = LinearRegression()#创建并拟合模型
    model.fit(x,y)
    excess=y-model.predict(x)#得到线性模型的拟合差异，计算超额收益的方差（按照理论，超额收益服从均值为0的正态分布
    sigma=np.var(excess)
    pre_05=model.predict(df['index'][date0:date5].reshape(-1,1))
    AR_05=df['stock'][date0:date5].reshape(-1,1)-pre_05
    CAR05=sum(AR_05)
    pre_55=model.predict(df['index'][end:date5].reshape(-1,1))
    AR_55=df['stock'][end:date5].reshape(-1,1)-pre_55
    CAR55=sum(AR_55)
    return CAR05,CAR55,sigma

def timezone(date):#日期处理，获得事件研究窗口的起始日期
    date0 = dt.datetime.strptime(date, "%Y/%m/%d").date()
    date5=w.tdaysoffset(5, date, "").Data[0][0].date()
    start=w.tdaysoffset(-180, date, "").Data[0][0].date()
    end=w.tdaysoffset(-5, date, "").Data[0][0].date()
    return start,end,date0,date5

def main(stkcd,date,index):
    start,end,date0,date5=timezone(date)
    stock=stock_price(stkcd,date5)
    df=df_data(index,stock,start,date5)
    CAR05,CAR55,sigma=reg(df,start,end,date0,date5)
    return CAR05,CAR55,sigma

if __name__=='__main__':
    index_code="000017.SH"#以新综指作为市场指数
    index=index_price(index_code)#得到新综指的长区间行情，方便匹配
    ###############################
    ##########Input Area###########
    ###############################
    stkcd='600602.SH'#输入需要研究的股票代码
    date="2017/10/1"#输入事件发生日期
    """
    CAR05是事件日至后5交易日的累计异常收益（0~5）
    CAR55是事件日前5个交易日至后5交易日的累计异常收益（-5~5）
    sigma是事件日前180个交易日至事件日前5交易日(窗口期)线性回归残差的方差,方便后续的CAAR检验
    """
    CAR05,CAR55,sigma=main(stkcd,date,index)
    
    
    
    
    












































